<?php
namespace Pinenut\Model2\Embedded\ReferenceContainer;

use Pinenut\Model2\Embedded\ReferenceContainer;
use Pinenut\Model2\Updaters;
use Pinenut\Model2\Updater;
use Pinenut\Model2\Embedded;

class Many extends ReferenceContainer {
	
	public function populate($data = array(), $fromDatabase = true) {
		// населяем контейнер массивом связей
		$this->_container = [];
		if (!empty($data)) 
		foreach ($data as $key=>$value) {
			$reference = clone $this->_reference;
			$reference->setParent($this);
			$reference->populate($value, $fromDatabase);
			$this->_container[(string)$reference] = $reference;
		}
		if ($fromDatabase) {
			$this->_raw = $data;
// 			if ('interests' == $this->_field) {
// 				print_r($this->_raw);
// 			}
		}
	}
	
	protected function updaters() {
		$isNew = $this->isNew();

		
		$i = 1; // FIXME: где-то не детектится нулевой индекс, приходится вносить поправку для новых записей, 
				// которая удаляется уже в адаптере при инсерте
		foreach ($this->_container as $key=>$reference) {
			/* @var $reference \Pinenut\Model2\Embedded\Reference */
			
			$updaters = $reference->updaters();
			
 			// для создания связи в базе, если её не было до этого - генерим добавление связи в массив
			if (! $isNew && count($updaters)) {
				$updater = new Updater();
				$updater->addToSet ( '', ['_ref' => $reference->_ref]);
				$updater->whereNot ( '_ref', $reference->_ref );
				$this->addUpdater ( $updater );
			}

			foreach ($updaters as $updater) {
				/* @var $updater \Pinenut\Model2\Updater */
//				echo "many-update:<pre>";print_r($updater);echo "</pre>/many-update<br>";
//				if (!is_object($updater)) exit;
//				print_r($updater);
				if (!$isNew) {
					if (!$updater->issetWhere('_ref')) {
						// тут мы определяем, что модифицируем определённую связь, 
						// ищем именно её и в именах для модификации указываем $ как указатель на найденую
						// TODO: придумать как задачть условие без этой хрени! это кастомное монговское решение
						$updater->where('_ref', $reference->_ref);
						$updater->prependFieldNames('$');	
					}
				} else {
					$updater->prependFieldNames($i);
				} 
//				print_r($updater);
				$this->addUpdater($updater);
			}
			
			$i++;
		}

		// удаляем связи которые были в раве, но которых не стало
		foreach ($this->_raw as $key=>$ref) {
			if (!isset($this->_container[(string)$ref['_ref']])) {
//echo "!!!!remote!!!".(string)$ref['_ref'];
				$updater = new Updater();
				$updater->removeFromSet('', $ref);
				$this->addUpdater ( $updater );
				unset($this->_raw[$key]);
			}
		}

//		echo "many:<pre>";print_r($this->_updaters);echo "</pre>/many<br>";
		
		// грохаем модификаторы
		// TODO: вынести в afterSave
		$updaters = $this->getUpdaters(true);
// 		echo "many updaters:";
// 		print_r($updaters);
		return $updaters;
	}
	

	protected function roundEmbedded($method) {
		if (!method_exists($this, $method)) {
			return;
		} else {
			$this->$method();
		}
	
		foreach ( $this->_container as $ref ) {
			if ($ref instanceof Embedded) {
				$ref->roundEmbedded($method);
			}
		}
	}
	
}
